package com.xunk.equipment.service.zhijia.vo;

import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import lombok.ToString;

import java.util.Map;

/**
 * @ProjectName: HIM
 * @Package: com.xunk.equipment.service.zhijia.vo
 * @ClassName: ShadowBeanVO
 * @Author: luanzhiwei
 * @Description: 智家设备影子信息实体类
 * @Date: 2021/4/9 16:36
 * @Version: 1.0
 */
@Data
@NoArgsConstructor
@EqualsAndHashCode
@ToString
public class ShadowBeanVO {
    /**
     * 影子基本信息 只读
     */
    private ShadowInfo shadowInfo;
    /**
     * 设备基本信息	只读（可为空，可以不含此项）
     */
    private DeviceInfo deviceInfo;
    /**
     * 设备上报状态的前一个变化版本，key是设备上报状态的属性名，value是上报的状态属性值	只读（可为空，可以不含此项）
     */
    private Map preChangeReported;

    /**
     * 设备上报的状态，key是设备上报状态的属性名，value是上报的状态属性值	只读（可为空，可以不含此项）
     */
    private Map reported;
    /**
     * 设备的预期操作和预期状态，key是设备预期的操作名或设备预期状态的属性名，value是设备预期操作的json的字符串形式或设备预期状态的属性值	只读（可为空，可以不含此项）
     */
    private Map desired;
    /**
     * 设备上报的事件，key是事件标示，value是事件内容	只读（可为空，可以不含此项）
     */
    private Map events;
    /**
     * metadata部分	只读（可为空，可以不含此项）
     */
    private Metadata metadata;

    @Data
    @NoArgsConstructor
    @EqualsAndHashCode
    @ToString
    class ShadowInfo {
        /**
         * 设备影子模型版本号	只读
         */
        private String shadowVersion;
        /**
         * 缓存时间戳：影子最后更新时间戳，只有设备状态发生变化及新增事件通知才更新该时间戳；新增设备下发指令不更新该时间戳；	只读（可为空，可以不含此项）
         */
        private long reportedTimestamp;
        /**
         * 缓存时间戳：影子最后告警时间戳，只有设备有告警上报才更新该时间戳；	只读（可为空，可以不含此项）
         */
        private long eventTimestamp;
        /**
         * 缓存时间戳：影子最后上下线时间戳，只有设备上线或者下线才更新该时间戳；	只读（可为空，可以不含此项）
         */
        private long onoffTimestamp;
        /**
         * 设备在线状态，在线/离线	只读（可为空，可以不含此项）
         */
        private boolean isOnline;
        /**
         * 设备网络质量	只读（可为空，可以不含此项）
         */
        private NetQualityInfo netQuality;
        /**
         * 路由器热点名称：wifi设备为连接路由器的ssid	只读（可为空，可以不含此项）
         */
        private String ssid;
    }

    @Data
    @NoArgsConstructor
    @EqualsAndHashCode
    @ToString
    class DeviceInfo {
        /**
         * 设备上报	只读
         */
        private String typeid;
        /**
         * 型号：业务进行调用接口存储	非必填，（可为空，可以不含此项）
         */
        private String deviceType;
        /**
         * 模块软件版本号（海尔wifi模块）	只读（可为空，可以不含此项）
         */
        private String softVersion;
        /**
         * 模块硬件版本号（海尔WIFI模块）	只读（可为空，可以不含此项）
         */
        private String hardVersion;
        /**
         * 设备连网类型：蓝牙、zigbee、wifi等	只读（可为空，可以不含此项）
         */
        private String connectType;
        /**
         * 时间版本号：格式如：2018032608，年月日小时格式	只读（可为空，可以不含此项）
         */
        private String timeVersion;
    }

    @Data
    @NoArgsConstructor
    @EqualsAndHashCode
    @ToString
    class Metadata {
        /**
         * previousReported部分中每个属性的时间戳，因此，可以确定状态的更新时间，key是设备上报状态的属性名	只读（可为空，可以不含此项）
         */
        private Map<String, MetadataItem> preChangeReported;
        /**
         * reported部分中每个属性的时间戳，因此，可以确定状态的更新时间，key是设备上报状态的属性名	只读（可为空，可以不含此项）
         */
        private Map<String, MetadataItem> reported;
        /**
         * desired部分中每个属性的时间戳，因此，可以确定状态的更新时间，key是设备预期的操作名或设备预期状态的属性名	只读（可为空，可以不含此项）
         */
        private Map<String, MetadataItem> desired;
        /**
         * events部分中每个属性的时间戳，因此，key确定状态的更新时间，可以是事件标示	只读（可为空，可以不含此项）
         */
        private Map<String, MetadataItem> events;


    }

    @Data
    @NoArgsConstructor
    @EqualsAndHashCode
    @ToString
    class MetadataItem {
        /**
         * previousReported、reported、desired和 events部分中每个属性的时间戳，因此，可以确定状态的更新时间	只读
         */
        private long timestamp;
    }

    @Data
    @NoArgsConstructor
    @EqualsAndHashCode
    @ToString
    class NetQualityInfo {
        /**
         * 网络信号强度	只读（可为空，可以不含此项）
         */
        private String netQuality;
        /**
         * 4次ping AP的平均延时，单位ms，如果4次ping都超时，值为-1，代表100%丢包	只读（可为空，可以不含此项）
         */
        private double timeDelayOfAP;
        /**
         * 4次ping AP的丢包数	只读（可为空，可以不含此项）
         */
        private double packetLossOfAP;
        /**
         * ping 网关/心跳时延，单位ms，如果ping超时，值为-1	只读（可为空，可以不含此项）
         */
        private double timeDelayOfGateway;
        /**
         * ping 网关/心跳是否丢失，1代表丢失，0代表未丢失	只读（可为空，可以不含此项）
         */
        private int packetLossOfGateway;
        /**
         * 平台收到设备上报的网络质量数据的时间戳	只读（可为空，可以不含此项）
         */
        private long timestamp;
    }


}
